package com.katze.boot.plugins.redis.operations;

import com.katze.boot.plugins.redis.RedisTemplateManager;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.Arrays;
import java.util.Collection;
import java.util.Date;
import java.util.concurrent.TimeUnit;
import java.util.function.Function;

/**
 * 说  明：
 * 作  者：zf.zeng
 * 日  期：2021-02-14 (星期日)
 **/
public class RedisOperations<V> {

    private final RedisTemplate<String, V> redisTemplate;
    public RedisTemplateManager<V> manager;

    public RedisOperations(RedisTemplate<String, V> redisTemplate){
        this.redisTemplate = redisTemplate;
    }

    public RedisOperations(RedisTemplateManager<V> manager){
        this.manager = manager;
        this.redisTemplate = this.manager.primary();
    }

    public <R>R select(int database, Function<RedisTemplate<String, V>, R> function){
        return function.apply(database < 0? this.redisTemplate:this.manager.select(database));
    }

    /**
     * 键值是否存在
     * @param key 键值
     */
    public Boolean exists(String key) {
        return redisTemplate.hasKey(key);
    }

    /**
     * 重名名key，如果newKey已经存在，则newKey的原值被覆盖
     * @param oldKey 旧键值
     * @param newKey 新键值
     */
    public void rename(String oldKey, String newKey) {
        redisTemplate.rename(oldKey, newKey);
    }

    /**
     * newKey不存在时才重命名
     * @param oldKey 旧键值
     * @param newKey 新键值
     * @return 修改成功返回true
     */
    public Boolean renameIfAbsent(String oldKey, String newKey) {
        return redisTemplate.renameIfAbsent(oldKey, newKey);
    }

    /**
     * 删除key
     * @param key 键值
     */
    public Boolean delete(String key) {
        return redisTemplate.delete(key);
    }

    /**
     * 删除多个key
     * @param keys 键值
     */
    public Long delete(String... keys) {
        return redisTemplate.delete(Arrays.asList(keys));
    }

    /**
     * 删除Key的集合
     * @param keys 键值
     */
    public Long delete(Collection<String> keys) {
        return redisTemplate.delete(keys);
    }

    /**
     * 设置key的生命周期
     * @param key 键值
     * @param time 时长
     * @param timeUnit 时间格式
     */
    public void expire(String key, long time, TimeUnit timeUnit) {
        redisTemplate.expire(key, time, timeUnit);
    }

    /**
     * 指定key在指定的日期过期
     * @param key 键值
     * @param date 指定日期
     */
    public void expireAt(String key, Date date) {
        redisTemplate.expireAt(key, date);
    }

    /**
     * 查询key的生命周期
     * @param key 键值
     * @param timeUnit 时间格式
     */
    public Long getExpire(String key, TimeUnit timeUnit) {
        return redisTemplate.getExpire(key, timeUnit);
    }

    /**
     * 将key设置为永久有效
     * @param key 键值
     */
    public void persist(String key) {
        redisTemplate.persist(key);
    }

}
